package com.sisgesbyte.web.managedBean.mantenimiento.administracion;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.servlet.http.HttpSession;
import org.primefaces.event.SelectEvent;
import org.primefaces.event.UnselectEvent;
import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.common.Validaciones;
import com.sisgesbyte.dao.beanDao.FiltrosBean;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.services.administracion.MantenimientoCategoriaCliente;
import com.sisgesbyte.services.administracion.MantenimientoPrecioProducto;
import com.sisgesbyte.services.administracion.MantenimientoProducto;
import com.sisgesbyte.services.administracion.MantenimientoTipoCampania;
import com.sisgesbyte.services.administracion.bean.CategoriaClienteBean;
import com.sisgesbyte.services.administracion.bean.CategoriaClienteListaRes;
import com.sisgesbyte.services.administracion.bean.PrecioProductoBean;
import com.sisgesbyte.services.administracion.bean.PrecioProductoListResponse;
import com.sisgesbyte.services.administracion.bean.ProductoBean;
import com.sisgesbyte.services.administracion.bean.ProductoListaResponse;
import com.sisgesbyte.services.administracion.bean.TipoCampaniaBean;
import com.sisgesbyte.services.administracion.bean.TipoCampaniaListaResponse;
import com.sisgesbyte.services.commonBean.GenericResponse;
import com.sisgesbyte.services.logistica.MantenimientoAlmacenService;
import com.sisgesbyte.services.logistica.bean.AlmacenBean;
import com.sisgesbyte.services.logistica.bean.ListaAlmacenResponse;
import com.sisgesbyte.web.managedBean.common.MantenimientoAbstract;
import com.sisgesbyte.web.managedBean.common.Utilitarios;
import com.sisgesbyte.web.managedBean.seguridad.OpcionesControlador;

@ManagedBean
@ViewScoped
public class PrecioProductosMBean extends MantenimientoAbstract implements Serializable{

	private static final long serialVersionUID = 1L;

	@EJB
	private MantenimientoProducto mantenimientoProducto;
	@EJB
	private MantenimientoAlmacenService mantenimientoAlmacenService;
	@EJB
	private MantenimientoPrecioProducto mantenimientoPrecioProducto;
	@EJB
	private MantenimientoCategoriaCliente mantenimientoCategoriaCliente;
	@EJB
	private MantenimientoTipoCampania mantenimientoTipoCampania;
	@Inject
	private Validaciones validaciones;
	@ManagedProperty(value = "#{opcionesControlador}")
	private OpcionesControlador opcionesControlador;
	@ManagedProperty(value = "#{utilitarios}")
	private Utilitarios utilitarios;
	private List<PrecioProductoBean> listaPrecioProducto;
	private List<PrecioProductoBean> selectedPrecioProducto;
	private List<CategoriaClienteBean> listaCategoriaCliente;
	private List<TipoCampaniaBean> listaTipoCampanias;
	private FiltrosSQLBean cadenaFiltros;
	private String tipoMantenimiento;
	private String saved;
	private String txtBuscar;
	private String estadoCorreo;
	private List<AlmacenBean> listaAlmacen;
	private List<ProductoBean> listaProductos;

	@PostConstruct
	private void init() {
		saved = "";
		tipoMantenimiento = "";
		txtBuscar = "";
		crearFiltro();
		inicializar();
		cargarCategoriaCliente();
		cargarTipoCampanias();
		cargarAlmacen();
		cargarProductos();
	}
	
	public MantenimientoPrecioProducto getMantenimientoPrecioProducto() {
		return mantenimientoPrecioProducto;
	}

	public void setMantenimientoPrecioProducto(
			MantenimientoPrecioProducto mantenimientoPrecioProducto) {
		this.mantenimientoPrecioProducto = mantenimientoPrecioProducto;
	}

	public Validaciones getValidaciones() {
		return validaciones;
	}

	public void setValidaciones(Validaciones validaciones) {
		this.validaciones = validaciones;
	}

	public OpcionesControlador getOpcionesControlador() {
		return opcionesControlador;
	}

	public void setOpcionesControlador(OpcionesControlador opcionesControlador) {
		this.opcionesControlador = opcionesControlador;
	}

	public List<PrecioProductoBean> getListaPrecioProducto() {
		return listaPrecioProducto;
	}

	public void setListaPrecioProducto(List<PrecioProductoBean> listaPrecioProducto) {
		this.listaPrecioProducto = listaPrecioProducto;
	}

	public List<PrecioProductoBean> getSelectedPrecioProducto() {
		return selectedPrecioProducto;
	}

	public void setSelectedPrecioProducto(
			List<PrecioProductoBean> selectedPrecioProducto) {
		this.selectedPrecioProducto = selectedPrecioProducto;
	}

	public FiltrosSQLBean getCadenaFiltros() {
		return cadenaFiltros;
	}

	public void setCadenaFiltros(FiltrosSQLBean cadenaFiltros) {
		this.cadenaFiltros = cadenaFiltros;
	}

	public String getTipoMantenimiento() {
		return tipoMantenimiento;
	}

	public void setTipoMantenimiento(String tipoMantenimiento) {
		this.tipoMantenimiento = tipoMantenimiento;
	}

	public String getSaved() {
		return saved;
	}

	public void setSaved(String saved) {
		this.saved = saved;
	}

	public String getTxtBuscar() {
		return txtBuscar;
	}

	public void setTxtBuscar(String txtBuscar) {
		this.txtBuscar = txtBuscar;
	}

	public List<CategoriaClienteBean> getListaCategoriaCliente() {
		return listaCategoriaCliente;
	}

	public void setListaCategoriaCliente(
			List<CategoriaClienteBean> listaCategoriaCliente) {
		this.listaCategoriaCliente = listaCategoriaCliente;
	}

	public List<TipoCampaniaBean> getListaTipoCampanias() {
		return listaTipoCampanias;
	}

	public void setListaTipoCampanias(List<TipoCampaniaBean> listaTipoCampanias) {
		this.listaTipoCampanias = listaTipoCampanias;
	}

	public Utilitarios getUtilitarios() {
		return utilitarios;
	}

	public void setUtilitarios(Utilitarios utilitarios) {
		this.utilitarios = utilitarios;
	}

	public String getEstadoCorreo() {
		return estadoCorreo;
	}

	public void setEstadoCorreo(String estadoCorreo) {
		this.estadoCorreo = estadoCorreo;
	}
	
	public List<AlmacenBean> getListaAlmacen() {
		return listaAlmacen;
	}

	public void setListaAlmacen(List<AlmacenBean> listaAlmacen) {
		this.listaAlmacen = listaAlmacen;
	}
	
	public List<ProductoBean> getListaProductos() {
		return listaProductos;
	}

	public void setListaProductos(List<ProductoBean> listaProductos) {
		this.listaProductos = listaProductos;
	}
	
	@Override
	public void inicializar() {
		estadoCorreo ="";
		try {
			PrecioProductoListResponse response = mantenimientoPrecioProducto.listaPrecioProducto(ObtenerIdTransaccion(), cadenaFiltros);
			if (Integer.valueOf(response.getCodigoRespuesta()) > -1) {
				listaPrecioProducto = response.getListaPrecioProducto();
			} else {
				System.out.println("No se encontro Data "+ response.getMensajeRespuesta());
			}
		} catch (Exception e) {
			System.out.println("Ocurrio un error al cargar Lista " + e);
		}
	}
	public void cargarCategoriaCliente() {
		try {
			FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
			CategoriaClienteListaRes response = mantenimientoCategoriaCliente.listaCategoriaCliente(ObtenerIdTransaccion(), filtroSQL);
			if (Integer.valueOf(response.getCodigoRespuesta()) > -1) {
				this.listaCategoriaCliente = response.getListaCategoriaCliente();
			} else {
				System.out.println("No se encontro Data "+ response.getMensajeRespuesta());
			}
		} catch (Exception e) {
			System.out.println("Ocurrio un error al cargar Lista " + e);
		}
	}
	public void cargarProductos(){
		
		ProductoListaResponse listaProductos = null;
		try{
			FiltrosSQLBean filtro = new FiltrosSQLBean();
			List<FiltrosBean> listaFiltros = new ArrayList<FiltrosBean>();
			FiltrosBean beanFiltro = new FiltrosBean();
			List<String> campo = new ArrayList<String>();
			campo.add("estado");
			beanFiltro.setCampos(campo);
			beanFiltro.setOperador("=");
			listaFiltros.add(beanFiltro);
			filtro.setListaFiltros(listaFiltros);
			List<Object> valores = new ArrayList<Object>();
			valores.add(true);
			filtro.setListaValores(valores);
			filtro.setCampoOrden("nombre");
			filtro.setTipoOrden("asc");
			listaProductos = mantenimientoProducto.listaProductos(ObtenerIdTransaccion(), filtro);
			System.out.println("Codigo Respuesta listaProductos: " + listaProductos.getCodigoRespuesta());
			if(listaProductos.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
				this.listaProductos=listaProductos.getListaProductos();
			}
		}catch(Exception e){
			System.out.println("Error al obtener los porductos");
		}
		
	}

	public void cargarTipoCampanias(){
		try {
			FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
			TipoCampaniaListaResponse response = mantenimientoTipoCampania.listaTipoCampanias(ObtenerIdTransaccion(), filtroSQL);
			if (Integer.valueOf(response.getCodigoRespuesta()) > -1) {
				this.listaTipoCampanias = response.getListaTipoCampanias();
			} else {
				System.out.println("No se encontro Data "+ response.getMensajeRespuesta());
			}
		} catch (Exception e) {
			System.out.println("Ocurrio un error al cargar Lista " + e);
		}
	}
	@Override
	public void unSelect(UnselectEvent event) {
		opcionesControlador.habilitarControles(selectedPrecioProducto.size());
	}

	@Override
	public void checkSelect(SelectEvent event) {
		opcionesControlador.habilitarControles(selectedPrecioProducto.size());
	}

	@Override
	public void seleccionarItem(SelectEvent event) {
		opcionesControlador.habilitarControles(selectedPrecioProducto.size());
	}

	@Override
	public void dobleSelect(SelectEvent event) {
		List<PrecioProductoBean> selected = new ArrayList<PrecioProductoBean>();
		selected.add((PrecioProductoBean) event.getObject());
		setSelectedPrecioProducto(selected);
		setSaved("");
		opcionesControlador.habilitarControles(selectedPrecioProducto.size());
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE);
	}

	@Override
	public void nuevoItem() {
		setSaved("");
		limpiarFormulario();
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_NUEVO);
	}

	@Override
	public void editItem() {
		setSaved("");
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE);
	}

	@Override
	public void updateInsertItem() {
		if (tipoMantenimiento.equalsIgnoreCase(ConstantesInternasSistema.TIPO_MANTENIMIENTO_NUEVO)) {
			guardarItem();
		}
		if (tipoMantenimiento.equalsIgnoreCase(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE)) {
			modificarItem();
		}
		
	}

	@Override
	public String ObtenerIdTransaccion() {
		FacesContext fCtx = FacesContext.getCurrentInstance();
		HttpSession session = (HttpSession) fCtx.getExternalContext().getSession(false);
		String sessionId = session.getId().replace(".undefined", "");
		return sessionId;
	}

	@Override
	public void guardarItem() {
		GenericResponse response = null;
		try {
			for (PrecioProductoBean bean : listaSeleccionados(selectedPrecioProducto)) {
				response = mantenimientoPrecioProducto.nuevoPrecioPrducto( ObtenerIdTransaccion(), bean);
				if (response.getCodigoRespuesta().equals( ConstantesInternasSistema.CODIGO_EXITO)) {
					setSaved(ConstantesInternasSistema.SAVED_ITEM_OK);
					System.out.println("Se registro Correctamente");
				} else {
					setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
					System.out.println("Hubo un error al Registrar " + response.getCodigoRespuesta() + " - " + response.getMensajeRespuesta());
				}
			}
			limpiarFormulario();
			inicializar();
		} catch (Exception e) {
			setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
			System.out.println("Error en el proceso " + e);
		}
	}

	@Override
	public void modificarItem() {
		GenericResponse response = null;
		try {
			for (PrecioProductoBean bean : listaSeleccionados(selectedPrecioProducto)) {
				response = mantenimientoPrecioProducto.editarPrecioProducto( ObtenerIdTransaccion(), bean);
				if (response.getCodigoRespuesta().equals( ConstantesInternasSistema.CODIGO_EXITO)) {
					setSaved(ConstantesInternasSistema.SAVED_ITEM_OK);
					System.out.println("Se Acualizo correctamente");
				} else {
					setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
					System.out.println("Hubo un Error al Actualizar de BD " + response.getCodigoRespuesta() + " - " + response.getMensajeRespuesta());
				}
			}
			inicializar();
		} catch (Exception e) {
			System.out.println("Error en el proceso " + e);
		}
	}

	@Override
	public void eliminarItem() {
		GenericResponse response = null;
		try {
			for (PrecioProductoBean bean : selectedPrecioProducto) {
				response = mantenimientoPrecioProducto.deletePrecioProducto(
						ObtenerIdTransaccion(), bean.getId());
				if (response.getCodigoRespuesta().equals(ConstantesInternasSistema.CODIGO_EXITO)) {
					System.out.println("Se elimino Correctamente");
				} else {
					System.out.println("No se pudo Eliminar de BD "
							+ response.getCodigoRespuesta() + " - "
							+ response.getMensajeRespuesta());
				}
			}
			inicializar();
			opcionesControlador.desactivarControles();
		} catch (Exception e) {
			System.out.println("Hubo un error al tratar de Eliminar " + e);
		}
	}

	@Override
	public void actualizarEstado() {
		GenericResponse response = null;
		try {
			for (PrecioProductoBean bean : listaSeleccionados(listaPrecioProducto)) {
				response = mantenimientoPrecioProducto.editarPrecioProducto(ObtenerIdTransaccion(), bean);
				if (response.getCodigoRespuesta().equals(ConstantesInternasSistema.CODIGO_EXITO)) {
					System.out.println("Se Acualizo correctamente");
				} else {
					System.out.println("No se pudo actualizar el Item con codigo "+ bean.getId());
				}
			}
			inicializar();
		} catch (Exception e) {
			System.out.println("Hubo un error al actualizar el estado");
		}
	}

	@Override
	public void limpiarFormulario() {
		List<PrecioProductoBean> listaBean = new ArrayList<PrecioProductoBean>();
		PrecioProductoBean bean = new PrecioProductoBean();
		bean.setActive(false);
		listaBean.add(bean);
		setSelectedPrecioProducto(listaBean);
	}
	
	public void enviarCorreoMasivo(){
		StringBuilder mensaje = new StringBuilder();
		mensaje.append("<html>");
		mensaje.append("<table>");
		mensaje.append("<tr style=\"border-bottom: 1px solid rgb(197, 183, 183);font-family: sans-serif;color: rgb(125, 106, 215);\">");
		mensaje.append("<td style=\"padding: 5px;\">");
		mensaje.append("ITEM");
		mensaje.append("</td>");
		mensaje.append("<td style=\"padding: 5px;\">");
		mensaje.append("CODIGO");
		mensaje.append("</td>");
		mensaje.append("<td style=\"padding: 5px;\">");
		mensaje.append("PRODUCTO");
		mensaje.append("</td>");
		mensaje.append("<td style=\"padding: 5px;\">");
		mensaje.append("PRECIO NORMAL");
		mensaje.append("</td>");
		mensaje.append("<td style=\"padding: 5px;\">");
		mensaje.append("PRECIO OFERTA");
		mensaje.append("</td>");
		mensaje.append("</tr>");
		int i=0;
		for (PrecioProductoBean bean : selectedPrecioProducto) {
			System.out.println("Seleccionado: " +bean.getId());
			mensaje.append("<tr style=\"border-bottom: 1px solid rgb(197, 183, 183);height: 20px;line-height: 20px;\">");
				mensaje.append("<td>");
				mensaje.append(++i);
				mensaje.append("</td>");
				mensaje.append("<td>");
				mensaje.append(bean.getCodProd());
				mensaje.append("</td>");
				mensaje.append("<td>");
				mensaje.append(bean.getProducto());
				mensaje.append("</td>");
				mensaje.append("<td>");
				mensaje.append(bean.getPrecioNormal());
				mensaje.append("</td>");
				mensaje.append("<td style=\"color:red\">");
				mensaje.append(bean.getPrecioCampana());
				mensaje.append("</td>");
			mensaje.append("</tr>");
		}
		mensaje.append("</table>");
		mensaje.append("</html>");
		String asunto = "Ofertas de " + utilitarios.getMesActual();
		try{
			GenericResponse enviarEmail = mantenimientoPrecioProducto.enviarEmailBoletin(ObtenerIdTransaccion(), asunto, mensaje.toString());
			if(enviarEmail.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
				setEstadoCorreo("Los correos fueron enviados");
			}else{
				setEstadoCorreo("Los correos no fueron enviados");
			}
			
		}catch(Exception e){
			System.out.println("Error : Ocurrio un error al enviar los correos " + e.getMessage());
			setEstadoCorreo("Error : Ocurrio un error al enviar los correos");
		}
	}
	public void cargarAlmacen(){
		
		ListaAlmacenResponse response = null;
		try{
			FiltrosSQLBean filtro = new FiltrosSQLBean();
			List<FiltrosBean> listaFiltros = new ArrayList<FiltrosBean>();
			FiltrosBean beanFiltro = new FiltrosBean();
			List<String> campo = new ArrayList<String>();
			campo.add("a.active");
			beanFiltro.setCampos(campo);
			beanFiltro.setOperador("=");
			listaFiltros.add(beanFiltro);
			filtro.setListaFiltros(listaFiltros);
			List<Object> valores = new ArrayList<Object>();
			valores.add(true);
			filtro.setListaValores(valores);
			filtro.setCampoOrden("a.cod_almacen");
			filtro.setTipoOrden("asc");
			response = mantenimientoAlmacenService.listaAlmacen(ObtenerIdTransaccion(), filtro);
			
			if(response.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
				this.listaAlmacen =response.getListaAlmacen();
			}
			
		}catch(Exception e){
			System.out.println("Error  a tratar de obtener los almacenes " + e.getMessage());
		}
	}
	@Override
	public void crearFiltro() {
		FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
		try {
			if (getTxtBuscar() != null
					&& getTxtBuscar().toString().length() > 0) {
				List<Object> valores = new ArrayList<>();
				List<FiltrosBean> filtro = new ArrayList<FiltrosBean>();
				FiltrosBean listaCampo = new FiltrosBean();
				List<String> campo = new ArrayList<String>();
				campo.add("pp.id");
				campo.add("cc.categoria");
				campo.add("p.cod_prod");
				campo.add("p.producto");
				campo.add("tc.descripcion");
				campo.add("a.cod_almacen");
				listaCampo.setCampos(campo);
				listaCampo.setOperador("like");
				filtro.add(listaCampo);
				filtroSQL.setListaFiltros(filtro);
				valores.add("%" + getTxtBuscar() + "%");
				filtroSQL.setListaValores(valores);

			} else {
				filtroSQL.setCampoOrden("pp.id");
				filtroSQL.setTipoOrden("desc");
			}
			setCadenaFiltros(filtroSQL);
			inicializar();
			opcionesControlador.habilitarControles(0);
		} catch (Exception e) {
			System.out.println("Error al crear filtro " + e);
			filtroSQL.setCampoOrden("pp.id");
			filtroSQL.setTipoOrden("desc");
		}
	}
	
	/*
	 * Metodo para recorrer y validar los tipos de campos seleccionados
	 */
	public List<PrecioProductoBean> listaSeleccionados(List<PrecioProductoBean> listaRequest) {
		List<PrecioProductoBean> response = new ArrayList<PrecioProductoBean>();
		for (PrecioProductoBean listaBean : listaRequest) {
			PrecioProductoBean bean = new PrecioProductoBean();
			bean.setActive(listaBean.getActive());
			bean.setAlmacenId(listaBean.getAlmacenId());
			bean.setCategoriaClienteId(listaBean.getCategoriaClienteId());
			bean.setId(listaBean.getId());
			bean.setPrecioCampana(listaBean.getPrecioCampana());
			bean.setPrecioNormal(listaBean.getPrecioNormal());
			bean.setProductoId(listaBean.getProductoId());
			bean.setTipoCampanaId(listaBean.getTipoCampanaId());
			response.add(bean);
		}
		return response;
	}
}
